/**
 * Classe che si occupa di ricostruire la struttura logica di un work
 * @param {Object} widentifier widentifier del work di cui si dovra` ricostruire la struttura
 * @param {Object} dataSource Oggetto DataSource che si riferisce al DS di provenienza
 * @param {Function} callback Funzione da richiamare al termine della fase di inizializzazione.
 * Ha la forma di: callback(AnalizeWork)
 */
function AnalizeWork(widentifier,dataSource,callback)
{
	/** Funzione chiamata una volta che il servizio diventa attivo. Viene passato il
	 * riferimento a this */
	this.onready = callback;

	/** Mantiene la risposta dell'interrogazione al dataSource */
	var response;
	
	/** Contiene i metadati relativi al work */
	var workInformations;
	
	/**
	 * Esegue sui response l'elaborazione xsl data in input, quindi chiama callback
	 * @param {Object} xsl XML del foglio di stile da eseguire
	 * @param {Object} callback Funzione da richiamare una volta completata la trasformazione.
	 * Ha la forma di callback(XmlFragment)
	 */
	this.elaborate = function(xsl,callback){
		var message = xslTransform(response,xsl,document);
		alert("RESPONSE:\n"+serialize(response));
		alert("XSL:\n"+serialize(xsl));
		alert("MESSAGE:\n"+serialize(message));
		callback(message);
	}
	
	/**
	 * Reperisce informazioni sul work
	 * @param {Object} infor Nome del campo del work da reperire
	 * @param {Object} index Eventuale indice dell'elemento desiderato (eventualmente null)
	 * @return {Object} Ritorna il valore del testo contenuto nel campo
	 */
	this.retriveInfo = function(infor,index)
	{
		if (index == null) index = 0;
		return workInformations.getElementsByTagName(infor)[index].nodeValue;
	}
	
	/**
	 * Aggirna le informazioni sul work
	 */
	this.update = function()
	{
		var onready = this.onready;
		this.onready = null;
		var This = this;
		dataSource.query( ("widentifier=" + widentifier),
			null,
			function(xhr){
				response = xhr.responseXML;
				/*DEB*/ //putOnScreen(response,"work",false);
				workInformations = response.getElementsByTagName('work')[0];
				/*
				if (this.lastStep)
					if (this.onready != null) onready(this);
				else
					this.lastStep = true;
				*/
				if (onready != null) onready(This);
				
			},
			function(xhr){
				alert("Errore nell'interrogazione al data source");
			});
	}
	
	/** COSTRUTTORE */
	this.update();
		

}
